/*
 * codec_manager.cpp
 *
 *  Created on: Dec 1, 2016
 *      Author: lwang
 */

#include "../include/codec_manager.h"

CodecManager::CodecManager() {

}

CodecManager::~CodecManager() {

}

BaseEncoder* CodecManager::getEncoderById(string encoder_id) {
	return encoders.at(encoder_id);
}

BaseDecoder* CodecManager::getDecoderById(string decoder_id) {
	return decoders.at(decoder_id);
}

int CodecManager::registerEnocder(string encoder_id, CODEC_TYPE codec_type, int width, int height) {

	BaseEncoder *encoder;
	int codec_error;
	switch(codec_type) {
	case CODEC_TYPE_H264_CPU:
		encoder = new X264Encoder(width, height);
		codec_error = encoder->init();
		if(codec_error != CODEC_OK) {
			return codec_error;
		}
		break;
	case CODEC_TYPE_H264_GPU:

		break;
	default:
		return CODEC_ERROR_CODEC_TYPE_NOT_SUPPORTED;
		break;
	}
	pair<string, BaseEncoder*> encoder_pair(encoder_id, encoder);
	encoders.insert(encoder_pair);

	return CODEC_OK;
}

int CodecManager::registerDeocder(string decoder_id, CODEC_TYPE codec_type) {

	BaseDecoder *decoder;
	int codec_error;
	switch(codec_type) {
	case CODEC_TYPE_H264_CPU:
		decoder = new FFmpegDecoder(codec_type);
		codec_error = decoder->init();
		if(codec_error != CODEC_OK) {
			return codec_error;
		}
		break;
	case CODEC_TYPE_H264_GPU:

		break;
	default:
		return CODEC_ERROR_CODEC_TYPE_NOT_SUPPORTED;
		break;
	}

	pair<string, BaseDecoder*> decoder_pair(decoder_id, decoder);
	decoders.insert(decoder_pair);
	return CODEC_OK;
}

void CodecManager::releaseEncoder(string encoder_id) {
	BaseEncoder* encoder = getEncoderById(encoder_id);
	encoder->close();
	encoders.erase(encoder_id);
}

void CodecManager::releaseDecoder(string decoder_id) {
	BaseDecoder* decoder = getDecoderById(decoder_id);
	decoder->close();
	decoders.erase(decoder_id);
}
